package com.chenjun.designpattern.structural.bridge;

/**
 * 理解该模式需要理解的概念：
 * 1.不希望抽象部分和”行为“有一种固定的绑定关系，而是应该动态变化的
 * 2.将抽象部分与实现部分分离，使它们都可以独立的变化。———《设计模式》GOF 
 * 例如：咖啡可以分为以下四种
 * 中杯咖啡，大杯咖啡，加奶咖啡，不加奶咖啡
 * 其中中杯和大杯是抽象部分，加奶和不加奶是行为部分，两个变化因素应该独立开来，然后使用桥接模式使之联系
 * 
 * 同理的一个例子：
 * 城市街道，高速公路，新司机，老司机
 * @author admin
 *
 */
public class 桥接模式
{

	public static void main(String[] args)
	{
		//自己挑选咖啡的大小
		Coffee coffee = new LargeCoffee();
		//挑选完咖啡之后选择行为
		 coffee.setAddivite(new MilkCoffee());
		 coffee.info();
	}
}

abstract class Coffee
{
	protected Addivite addivite;
	
	public void setAddivite(Addivite addivite)
	{
		this.addivite = addivite;
	}

	protected abstract void info();
}

/**\
	中等咖啡，+ 行为由具体实现类决定
 * @author admin
 *
 */
class MediumCoffee extends Coffee
{
	@Override
	protected void info()
	{
		System.out.println("中杯咖啡,"+this.addivite.addiviteAction());
	}
}

class LargeCoffee extends Coffee
{

	@Override
	protected void info()
	{
		System.out.println("大杯咖啡,"+this.addivite.addiviteAction());
	}
}

/**
 * 添加行为类
 */
abstract class Addivite
{
	public abstract String addiviteAction();
}

class MilkCoffee extends Addivite
{
	
	@Override
	public String addiviteAction()
	{
		return "加奶";
	}
}

class NoMilkCoffee extends Addivite
{
	@Override
	public String addiviteAction()
	{
		return "不加奶";
	}
}




